Argo CD 是一個整合 Kubernetes 的開源 GitOps 框架。是用於在 Kubernetes 上運行和管理作業和應用程式的雲原生工具。即主要目的是應用程式交付。在 Argo 的生態還有 event、Workflows 和 Rollout 等。
從上圖來看,部署資源來源包括儲存庫 URL 與目錄。一般來說,儲存庫包含多個目錄,每個部署資源環境也許是一個目錄。如下
Prd
deploy.yaml
dev
deploy.yaml
qas
deploy.yaml
前面章節說明了 Helm Chart 和 Kustomize。對 Argo CD 而言,目錄下面不一定要是標準的 Kubernetes YAML 檔案,其可以整合 Helm 與 Kustomize。
部署的目的地(Destination)定義了資源必須部署的位置,並包括目標 Kubernetes 集群的 API 伺服器位置,以及 Kubernetes 的 namespace 名稱。因此,Argo CD 的應用程式代表部署在 Kubernetes 集群中的環境,並將其連接到存儲在 Git 儲存庫中的所需狀態。
可以邏輯上對 Argo CD 資源進行分群。這非常靈活的方式用來獨立管理不同的資源。白話的說,想像一下你有一間大公司,裡面有很多個團隊,每個團隊都在開發不同的產品。這些產品就像是一棟棟房子,而 Kubernetes 集群就是蓋房子的地基。而這些房子由 Argo CD 管理,因此會帶來以下優勢
Team-A 只能存取 Project-A 所定義的資源,不能跨越至 Project-B。從圖來看 Project-A 使得 Team-A 只能存取定義的儲存庫 Repo 和 Kubernetes 的 namespace。而部署 Application 資源時會綁定特定的 Project,來讓 Project 進行邏輯上的約束。
直接上官方圖
對於 Gitops 概念來看,基本上,只需要 clone
具有 YAML 的 Git 儲存庫,並使用 kubectl diff
和 kubectl apply
來檢測和處理配置上的異動。從圖上來看有很多的階段
每個階段都有對應的 Argo CD 資源,且每個階段的實作必須以不同的方式進行擴展。一個獨立的 Argo CD 元件負責每個階段。
Repository-server 負責擷取 YAML 資源清單並與 Application Controller 交互。使用者或是第三方工具的交互則可以透過 API Server 服務進行等。上圖只是部分元件,而外的像是有 notification server 或是 ApplicationSet server 等服務,其面相用途有所不同,後面章節會再提到。
建立 4 個 K3d 環境,一個用於 Argo CD,剩下模擬 dev、qas 與 prd 環境。這些環境可以參考本人的 github。在 K3d 配置檔中 kubeAPI
欄位可依照環境需求進行配置。那預設上是把 Ingress 功能給關閉,所以下面手動安裝了 Ingress Nginx。
建立 Argo CD CD 環境
k3d cluster create -c argocd-conf.yaml --servers-memory 6G --agents-memory 2G
安裝 Ingress 資源
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm search repo ingress-nginx
NAME CHART VERSION APP VERSION DESCRIPTION
ingress-nginx/ingress-nginx 4.10.1 1.10.1 Ingress controller for Kubernetes using NGINX a...
$ helm install ingress-nginx ingress-nginx/ingress-nginx --version 4.10.1 --namespace ingress-nginx --create-namespace
$ kubectl get all -n ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-controller-7d5fb757db-gx8hp 1/1 Running 0 2m36s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller-admission ClusterIP 10.43.138.141 <none> 443/TCP 2m36s
service/ingress-nginx-controller LoadBalancer 10.43.236.109 172.19.0.2,172.19.0.3,172.19.0.4 80:32369/TCP,443:31027/TCP 2m36s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 2m36s
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-7d5fb757db 1 1 1 2m36s
安裝 Argo CD 資源
crds:
install: true
global:
domain: argo.cch.com
logging:
format: json
level: info
configs:
cm:
create: true
exec.enabled: false
admin.enabled: true
statusbadge.enabled: true
params:
create: true
otlp.address: ''
server.insecure: false
server.basehref: /argocd
server.rootpath: '/argocd'
server.staticassets: /shared/app
server.disable.auth: false
server.enable.gzip: true
server.x.frame.options: sameorigin
rbac:
create: true
policy.default: ''
policy.csv: ''
scopes: "[groups]"
policy.matchMode: "glob"
redis-ha:
enabled: true
controller:
replicas: 1
server:
autoscaling:
enabled: true
minReplicas: 1
extensions:
# -- Enable support for Argo CD extensions
enabled: false
extensionList: []
# - name: extension-metrics
# env:
# - name: EXTENSION_URL
# value: https://github.com/argoproj-labs/argocd-extension-metrics/releases/download/v1.0.0/extension.tar.gz
# - name: EXTENSION_CHECKSUM_URL
# value: https://github.com/argoproj-labs/argocd-extension-metrics/releases/download/v1.0.0/extension_checksums.txt
certificate:
enabled: false
# TLS certificate configuration via Secret
ingress:
enabled: true
ingressClassName: "nginx"
paths:
- /argocd
pathType: Prefix
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
kubernetes.io/tls-acme: "true"
tls:
- secretName: argocd-secret # # do not change, this is provided by Argo CD
hosts:
- argo.cch.com
repoServer:
autoscaling:
enabled: true
minReplicas: 2
applicationSet:
replicaCount: 1
$ helm repo add argo https://argoproj.github.io/argo-helm
$ helm search repo argo-cd
NAME CHART VERSION APP VERSION DESCRIPTION
argo/argo-cd 7.1.3 v2.11.3 A Helm chart for Argo CD, a declarative, GitOps...
$ helm install argo-cd argo/argo-cd --version 7.1.3 --namespace argo --create-namespace -f values.yaml
NAME: argo-cd
LAST DEPLOYED: Mon Feb 27 14:54:00 2023
NAMESPACE: argo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
In order to access the server UI you have the following options:
1. kubectl port-forward service/argo-cd-argocd-server -n argo 8080:443
and then open the browser on http://localhost:8080 and accept the certificate
2. enable ingress in the values file `server.ingress.enabled` and either
- Add the annotation for ssl passthrough: https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-1-ssl-passthrough
- Set the `configs.params."server.insecure"` in the values file and terminate SSL at your ingress: https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-2-multiple-ingress-objects-and-hosts
After reaching the UI the first time you can login with username: admin and the random password generated during the installation. You can find the password by running:
kubectl -n argo get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
(You should delete the initial secret afterwards as suggested by the Getting Started Guide: https://argo-cd.readthedocs.io/en/stable/getting_started/#4-login-using-the-cli)
到這邊基本上就可以把 Argo CD 環境建置完成了。